package ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo;

import java.util.ArrayList;
import java.util.List;

import ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.negocio.Simulador;

public class Punto implements Infraestructura {

	private Long id = null;
	private Camino anterior = null;
	private List<Camino> listCaminoAnterior = null;
	private Camino posterior = null;
	private Camino propietario = null;
	private Carro carro = null;
	private Sensor sensor = null;

	public Punto() {
		sensor = new Sensor(this);
		sensor.getTipo().add(EnumEvento.OBSTACULO);
		sensor.getTipo().add(EnumEvento.PROXIMIDAD);
	}

	private static Long idFactory = null;

	private static Long getIdFactory() {
		if (idFactory == null) {
			idFactory = new Long(0);
		}
		idFactory = new Long(idFactory.longValue() + 1);
		return idFactory;
	}

	public static Punto factory(Camino anterior, Camino posterior,
			List<Camino> listCaminoAnterior) {
		Punto punto = new Punto();
		punto.setId(getIdFactory());
		punto.setCarro(null);
		punto.setAnterior(anterior);
		punto.setPosterior(posterior);
		punto.setPropietario(null);
		punto.setListCaminoAnterior(listCaminoAnterior);
		return punto;
	}

	public static Punto factory() {
		return Punto.factory(null, null, null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Infraestructura
	 * #getId()
	 */
	@Override
	public Long getId() {
		return id;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Infraestructura
	 * #setId(java.lang.Long)
	 */
	@Override
	public void setId(Long id) {
		this.id = id;
	}

	/*
	 * ( non-Javadoc)
	 * 
	 * @see
	 * ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Infraestructura
	 * #getTipo()
	 */
	@Override
	public String getTipo() {
		return "Punto";
	}

	/**
	 * @return the anterior
	 */
	public Camino getAnterior() {
		return anterior;
	}

	/**
	 * @param anterior
	 *            the anterior to set
	 */
	public void setAnterior(Camino anterior) {
		this.anterior = anterior;
	}

	/**
	 * @return the listCaminoAnterior
	 */
	public List<Camino> getListCaminoAnterior() {
		return listCaminoAnterior;
	}

	/**
	 * @param listCaminoAnterior
	 *            the listCaminoAnterior to set
	 */
	public void setListCaminoAnterior(List<Camino> listCaminoAnterior) {
		this.listCaminoAnterior = listCaminoAnterior;
	}

	/**
	 * @return the posterior
	 */
	public Camino getPosterior() {
		return posterior;
	}

	/**
	 * @param posterior
	 *            the posterior to set
	 */
	public void setPosterior(Camino posterior) {
		this.posterior = posterior;
	}

	/**
	 * @return the carro
	 */
	public Carro getCarro() {
		return carro;
	}

	/**
	 * @param carro
	 *            the carro to set
	 */
	public void setCarro(Carro carro) {
		this.carro = carro;
	}

	/**
	 * @return the sensor
	 */
	public Sensor getSensor() {
		return sensor;
	}

	/**
	 * @param sensor
	 *            the sensor to set
	 */
	public void setSensor(Sensor sensor) {
		this.sensor = sensor;
	}

	/**
	 * @return the propietario
	 */
	public Camino getPropietario() {
		return propietario;
	}

	/**
	 * @param propietario
	 *            the propietario to set
	 */
	public void setPropietario(Camino propietario) {
		this.propietario = propietario;
	}

	@Override
	public void recibirEventoObstaculo(Entidad emisor) {
		if (sensor.getListEvento() == null) {
			sensor.setListEvento(new ArrayList<Evento>());
		}
		sensor.recibirEvento(
				Evento.factory(EnumEvento.OBSTACULO, null, "OBSTACULO",
						Simulador.CICLOS, emisor));
	}

	@Override
	public void recibirEventoProximidad(Entidad emisor) {
		if (sensor.getListEvento() == null) {
			sensor.setListEvento(new ArrayList<Evento>());
		}
		sensor.recibirEvento(Evento.factory(EnumEvento.PROXIMIDAD, null, "PROXIMIDAD",
				Simulador.CICLOS, emisor));
	}

	/* (non-Javadoc)
	 * @see ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Entidad#recibirEventoHumedad(ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Entidad, java.lang.String)
	 */
	@Override
	public void recibirEventoHumedad(Entidad emisor, String valor) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Entidad#recibirEventoLluvia(ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Entidad, java.lang.String)
	 */
	@Override
	public void recibirEventoLluvia(Entidad emisor, String valor) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Entidad#recibirEventoViento(ar.uba.fi.cimII7566.cuat201102.automatizacionNegroHumo.modelo.Entidad, java.lang.String)
	 */
	@Override
	public void recibirEventoViento(Entidad emisor, String valor) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void eliminarEvento(Entidad emisor) {
		if (sensor != null) {
			sensor.eliminarEvento(emisor);
		}
	}

	@Override
	public String toString() {
		return "Punto [id = " + id.toString() + "]";
	}
}